#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+2;
int n,m,Q;
int fx[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char s[maxn][maxn];
int fa[maxn][maxn],num[maxn][maxn][5];
bool vis[maxn][maxn];
struct node_p{
    int x,y;
};
bool check(int x,int y){
    return x>=1&&x<=n&&y>=1&&y<=m&&s[x][y]=='1';
}
void dfs(int x,int y,int fax,int fay,int ty){
    fa[x][y]=ty;
    vis[x][y]=1;
    for(int i=0,nx,ny;i<4;i++){
        nx=x+fx[i][0],ny=y+fx[i][1];
        if((nx==fax&&ny==fay)||!check(nx,ny))continue;
        dfs(nx,ny,x,y,i);
    }
    return ;
}
int main(){
    freopen("unicom.in","r",stdin);
    freopen("unicom.out","w",stdout);
    memset(fa,-1,sizeof(fa));
    scanf("%d%d%d",&n,&m,&Q);
    for(int i=1;i<=n;i++){
        scanf("%s",s[i]+1);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(s[i][j]=='1'&&!vis[i][j]){
                dfs(i,j,0,0,4);
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            num[i][j][0]=num[i][j-1][0]+(fa[i][j]==0);
            num[i][j][1]=num[i][j-1][1]+(fa[i][j]==1);
            num[i][j][2]=num[i-1][j][2]+(fa[i][j]==2);
            num[i][j][3]=num[i-1][j][3]+(fa[i][j]==3);
            num[i][j][4]=num[i-1][j][4]+num[i][j-1][4]-num[i-1][j-1][4]+(fa[i][j]==4);
        }
    }
    // for(int i=1;i<=n;i++){
    //     for(int j=1;j<=m;j++)printf("fa[%d][%d]=%d \n",i,j,fa[i][j]);
    // }
    node_p a,b;
    int ans;
    for(int i=1;i<=Q;i++){
        scanf("%d%d%d%d",&a.x,&a.y,&b.x,&b.y);
        ans=num[b.x][b.y][4]-num[b.x][a.y-1][4]-num[a.x-1][b.y][4]+num[a.x-1][a.y-1][4];
        // printf("pas =%d\n",ans);
        ans+=(num[b.x][b.y][0]-num[b.x][a.y-1][0]);
        ans+=(num[a.x][b.y][1]-num[a.x][a.y-1][1]);
        ans+=(num[b.x][b.y][2]-num[a.x-1][b.y][2]);
        ans+=(num[b.x][a.y][3]-num[a.x-1][a.y][3]);
        printf("%d\n",ans);
    }
    return 0;
}